package mysqls

import (
	"errors"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

var (
	ErrRecordNotFound = logger.ErrRecordNotFound
	ErrSaveFailed     = errors.New("database save failed")
	ErrCreatedFailed  = errors.New("create record failed")
	ErrUpdatedFailed  = errors.New("update record failed")
	ErrDeletedFailed  = errors.New("delete record failed")
	ErrQueryFailed    = errors.New("database query failed")
)

/**
 * mysql 配置数据结构
 */
type Conf struct {
	// 日志配置
	LogConf ConfLog
	// mysql 配置
	MysqlConf mysql.Config
	// gorm 配置
	GromConf gorm.Config
	// mysql 引擎: InnoDB, MyISAM, MEMORY...
	Engine          string        // 引擎类型， 示例 InnoDB
	MaxIdleConns    int           // 最大空闲连接数， 示例 10
	MaxOpenConns    int           // 最大开启连接数， 示例 100
	ConnMaxLifetime time.Duration // 示例 time.Hour

	// 日志Writer， 不设置表示会使用 ConfLog 里面的文件日志
	LogWriter Writer
}

// 定义一个变量用于保存全局的 mysql-db 的连接
var DB *gorm.DB

/**
 * 新建一个 mysql 工具
 */
func New(conf *Conf) *gorm.DB {
	// 配置 grom 的日志
	conf.GromConf.Logger = NewLogger(conf.LogConf, conf.LogWriter)
	// mysql 驱动自定义配置
	mysqlDb, err := gorm.Open(mysql.New(conf.MysqlConf), &conf.GromConf)
	if err != nil {
		panic("连接mysql失败" + err.Error())
	}
	if mysqlDb.Error != nil {
		panic("连接database失败" + mysqlDb.Error.Error())
	}
	// 设置在 AutoMigrate 创建表时添加后缀
	if conf.Engine != "" {
		mysqlDb.Set("gorm:table_options", "ENGINE="+conf.Engine)
	}
	// 链接池
	sqlDB, err := mysqlDb.DB()
	if err != nil {
		panic("连接池失败" + err.Error())
	}

	if conf.MaxIdleConns != 0 {
		sqlDB.SetMaxIdleConns(10)
	}
	if conf.MaxOpenConns != 0 {
		sqlDB.SetMaxOpenConns(100)
	}
	if conf.ConnMaxLifetime != 0 {
		sqlDB.SetConnMaxLifetime(time.Hour)
	}
	return mysqlDb
}
